package ge.util;

import ge.escola.Disciplina;

import java.util.GregorianCalendar;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * Classe que reune os metodos utilizados para validar atributos das classes.
 * 
 */
public class Validadores {

	/**
	 * 
	 * @param nome
	 *            Nome a ser validado.
	 * @return True para nome valido, False para nome invalido.
	 */
	public static boolean validaNome(String nome) {
		nome = nome.replace(" ", "");
		if (nome.length() < 2 || nome == null)
			return false;

		Pattern padrao = Pattern.compile("\\p{Alpha}*");
		Matcher meta = padrao.matcher(nome);
		if (!(meta.matches())) {
			return false;
		}
		return true;
	}

	/**
	 * 
	 * @param email2
	 *            Email a ser validado
	 * @return True para email valido, False para email invalido.
	 */
	public static boolean validaEmail(String email2) {
		Pattern padrao1 = Pattern
				.compile("^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$");
		Matcher meta1 = padrao1.matcher(email2);
		if (!(meta1.matches())) {
			return false;
		}
		return true;
	}

	/**
	 * 
	 * @param cpf
	 *            Cpf a ser validado.
	 * @return True para cpf valido, False para cpf invalido.
	 */
	public static boolean validaCpf(String cpf) {
		Pattern padrao = Pattern.compile("[0-9]{3}.[0-9]{3}.[0-9]{3}-[0-9]{2}");
		Matcher meta = padrao.matcher(cpf);
		return meta.matches();

	}

	/**
	 * 
	 * @param endereco2
	 *            Endereco a ser validado
	 * @return True para endereco valido, False para endereco invalido.
	 */
	public static boolean validaEndereco(String endereco2) {
		endereco2 = endereco2.trim();
		if (endereco2 == null || endereco2.replace(" ", "").length() == 0) {
			return false;
		}
		return true;
	}

	/**
	 * 
	 * @param telefone2
	 *            Telefone a ser validado.
	 * @return True para telefone valido, False para telefone invalido.
	 */
	public static boolean validaTelefone(String telefone2) {
		Pattern padrao = Pattern
				.compile("[(]{1}[0-9]{2}[)]{1}[0-9]{4}-[0-9]{4}");
		Matcher meta = padrao.matcher(telefone2);
		return meta.matches();
	}

	/**
	 * 
	 * @param ano
	 *            Ano a ser validado
	 * @return True para ano valido, False para ano invalido.
	 */
	public static boolean validaAno(String ano) {
		Pattern padrao = Pattern.compile("[0-9]{4}");
		Matcher meta = padrao.matcher(ano);
		return meta.matches();
	}

	/**
	 * 
	 * @param horario
	 *            Horario a ser validado.
	 * @return True para horario valido, False para horario invalido.
	 */
	public static boolean validaHora(String horario) {
		Pattern padrao = Pattern.compile("[0-9]{2}:[0-9]{2}");
		Matcher meta = padrao.matcher(horario);
		if (!(meta.matches()))
			return false;

		String[] array = horario.split(":");
		int hora = Integer.parseInt(array[0]);
		int minutos = Integer.parseInt(array[1]);
		if (hora > 23 || minutos > 59 || !meta.matches()) {
			return false;
		}
		return true;
	}

	/**
	 * 
	 * @param todasDisciplinas
	 *            Lista de todas as disciplinas ja cadastradas.
	 * @return Codigo da disciplina
	 */
	public static String geraCodigoDisciplina(List<Disciplina> todasDisciplinas) {
		GregorianCalendar calendar = new GregorianCalendar();
		Random rand = new Random();
		int num = rand.nextInt(9999)
				- (calendar.DAY_OF_YEAR + calendar.DAY_OF_MONTH);
		for (Disciplina disciplina : todasDisciplinas) {
			if (disciplina.getCodigo().equals(String.valueOf(num))) {
				num = Integer.valueOf(geraCodigoDisciplina(todasDisciplinas));
			}
		}
		if (num <= 0) {
			num = Integer.valueOf(geraCodigoDisciplina(todasDisciplinas));
		}
		String codigo = intToStringCodigoDisciplina(num);
		return codigo;
	}

	private static String intToStringCodigoDisciplina(int numero) {
		String codigo;
		if (numero < 10) {
			codigo = "000" + numero;
			return codigo;
		} else if (numero < 100) {
			codigo = "00" + numero;
			return codigo;
		} else if (numero < 1000) {
			codigo = numero + "0";
			return codigo;
		} else {
			codigo = numero + "";
			return codigo;
		}
	}

	/**
	 * 
	 * @param codigo
	 *            Codigo de disciplina a ser validado.
	 * @return True para codigo de disciplina valido, False para codigo de
	 *         disciplina invalido.
	 */
	public static boolean validaCodigoDisciplina(String codigo) {
		Pattern padrao = Pattern.compile("[0-9]*");
		Matcher meta = padrao.matcher(codigo);
		return meta.matches();
	}

}